/*
   Vista y funciones de Stock  
   Vista -  soporte.vstock_diferencia 
   funciones - soporte.stock_actualizar_stk() 
             - soporte.stock_regenerar_stkestxart() 

   Edu - 15/05/2021
*/

-- ===============================================
-- VISTA QUE MUESTRA LAS DIFERENCIAS DE STOCK QUE TIENE LA TABLA stk.
-- Considera ademas los que estan en stk pero no tienen movimientos para ese art/dep.
-- ===============================================

CREATE OR REPLACE VIEW soporte.vstock_diferencias AS 

SELECT z.idart, art.cod, art.nombre, z.codstkdep, z.stock_real, z.stock_stk as stock_en_stk
FROM
(
select y.idart, y.codstkdep, coalesce(sum(y.stock_real), 0.00) as stock_real, coalesce(sum(y.stock_stk), 0.00) as stock_stk
from
(
select x.idart, x.codstkdep,
       case when x.tipo = 'REAL' then stock else 0.00 end as stock_real, 
       case when x.tipo = 'STK' then stock else 0.00 end as stock_stk
from
(
select art.id as idart, artm.codstkdep, 'REAL' as tipo, sum(artm.cant * artm.signo) as stock
from art
join artm on art.id = artm.idart
where artm.modificastock = 'S' and art.registrastock = 'S'
group by 1,2
union all
select idart, codstkdep, 'STK' as tipo, stock
from stk
) x
) y
group by 1,2
) z
JOIN art ON z.idart = art.id
WHERE art.registrastock = 'S' AND z.stock_real <> z.stock_stk
ORDER BY z.idart,z.codstkdep;

ALTER TABLE soporte.vstock_diferencias OWNER TO abacouser;


-- ===============================================
-- FUNCION QUE ACTUALIZA E INSERTA EN LA TABLA stk EN FUNCION DE LOS MOVIMIENTOS QUE MUEVEN EL FISICO.
-- ===============================================

CREATE OR REPLACE FUNCTION soporte.stock_actualizar_stk()
  RETURNS character varying AS
$BODY$
DECLARE
BEGIN
-- ACTUALIZA E INSERTA EN LA TABLA stk EN FUNCION DE LOS MOVIMIENTOS QUE MUEVEN EL FISICO.
-- COMO LLAMARLA:     select soporte.stock_actualizar_stk()

--Para modificar los STK que tienen diferencia.

UPDATE stk SET stock = v.stock_real
FROM soporte.vstock_diferencias v
WHERE stk.idart = v.idart AND stk.codstkdep = v.codstkdep;

-- Para insertar en STK los que no estan y tuvieron movimientos.

INSERT INTO stk(idart, codstkdep, stockminimo, reposicion, stock)
SELECT v.idart, v.codstkdep, 0.00, 0.00, v.stock_real
FROM soporte.vstock_diferencias v
WHERE NOT EXISTS (select * from stk mi_stk where v.idart = mi_stk.idart and v.codstkdep = mi_stk.codstkdep);

-- No hay un query para eliminar del STK los que tienen cero, porque el primera update se los pone.

RETURN ' ';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE COST 100;
ALTER FUNCTION soporte.stock_actualizar_stk() OWNER TO abacouser;


-- ===============================================
-- FUNCION QUE REGENERA LA TABLA stkestxart
-- ===============================================

CREATE OR REPLACE FUNCTION soporte.stock_regenerar_stkestxart()
  RETURNS character varying AS
$BODY$
DECLARE
BEGIN
-- REGENERA LA TABLA stkestxart QUE SE USA POR EJ. PARA MIRAR EL TOTAL DE PENDIENTES EN LA GRILLA DE TOMAR PENDIENTES DENTRO DE UN COMPROBANTE
-- (no se usa mucho, es redundante en la db)
-- COMO LLAMARLA:     select soporte.stock_regenerar_stkestxart()

-- Inicializacion de la tabla stkestxart

DELETE FROM stkestxart;

-- Insercion de las filas

INSERT INTO stkestxart(codstkest, codstkdep, idart, cant)
SELECT codstkest, codstkdep, idart, sum(cantpendiente)
FROM artm
WHERE cantpendiente <> 0
GROUP BY 1,2,3;

RETURN ' ';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE COST 100;
ALTER FUNCTION soporte.stock_regenerar_stkestxart() OWNER TO abacouser;


-- ==================================
 SELECT aaVersion('456.01','456.00');
-- ==================================